home *** CD-ROM | disk | FTP | other *** search
/ Freaks Macintosh Archive / Freaks Macintosh Archive.bin / Freaks Macintosh Archives / Ham⁄GPS / SoftKiss.src.1.8 Folder / SoftKiss.src.1.8 / core / sfk_core_new_state.c < prev    next >
Text File  |  1993-03-12  |  2KB  |  87 lines

  1. /*
  2.  * sfk_state_change.c - handle major state changes
  3.  */
  4.  
  5. #include "sfk_core.h"
  6. #include "sfk_core_private.h"
  7. #include "sfk_die.h"
  8.  
  9. /*
  10.  * transition from off to recieve mode
  11.  */
  12. static void sfk_leave_off(sfk_prt_pt p)
  13. {
  14.     sfk_setup_scc(p);
  15.     sfk_install_interupt_vectors(p); /*also sets recieve mode*/
  16.     sfk_keydown(p);
  17.     p->sfk_IVAR(online)=TRUE;
  18. }
  19.  
  20. /*
  21.  * key transmit
  22.  * -interupt
  23.  */
  24. static void sfk_key_xmit_timer(sfk_prt_pt p)
  25. {
  26.     sfk_go_state(p,PX_KEY_UP);
  27. }
  28.  
  29. /*
  30.  * handle a transition to a new state
  31.  */
  32. void sfk_go_state(sfk_prt_pt p,px_states new_state)
  33. {
  34.     px_states old_state=p->sfk_state;
  35.     p->sfk_state=new_state;
  36.     p->sfk_IVAR(state_var)=new_state;
  37.     if(new_state==old_state)
  38.         return;    //transition to same state
  39.     if(old_state==PX_OFF)        //leaveing off go to recieve first
  40.         sfk_leave_off(p);
  41.     dbo_fputc(&p->dbo,'0'+new_state);
  42.     switch(new_state) {
  43.     case PX_OFF:
  44.         sfk_keydown(p);
  45.         sfk_reset_scc(p);
  46.         sfk_clear_timer(p);
  47.         sfk_remove_interupt_vectors(p);
  48.         p->sfk_IVAR(online)=FALSE;
  49.         break;
  50.     case PX_RX:
  51.         sfk_keydown(p);
  52.         sfk_set_recv_mode(p);
  53.         break;
  54.     case PX_RX_NOW:
  55.         sfk_set_recv_now_mode(p);
  56.         break;
  57.     case PX_RX_CHUCK:
  58.         sfk_set_recv_chuck_mode(p);
  59.         break;
  60.     case PX_SLOT_WAIT:
  61.         {
  62.             unsigned long wait_time=0;
  63.             wait_time+=p->sfk_IVAR(os_xmit_dwait);
  64.             if(die(PERSISTANCE_LIMIT)>p->sfk_IVAR(xmit_persist))
  65.                 wait_time+=p->sfk_IVAR(os_xmit_slottime);
  66.             if(wait_time>0)
  67.                 sfk_install_timer(p,
  68.                     sfk_key_xmit_timer,
  69.                     wait_time);
  70.             else
  71.                 sfk_go_state(p,PX_KEY_UP);
  72.         }
  73.         break;
  74.     case PX_KEY_UP:
  75.         sfk_tell_scc_to_xmit(p);
  76.         break;
  77.     case PX_XMIT:
  78.         sfk_send_first_byte(p);
  79.         break;
  80.     case PX_TAIL:
  81.         sfk_tail(p);
  82.         break;
  83.     default:
  84.         SFK_ASSERT(FALSE,SFK_TEXT(52));
  85.     }
  86. }
  87.